/*用于处理与用户相关的 HTTP 请求。控制器中的方法与用户实体（User）和服务层（UserService）交互，以实现用户管理功能*/
package com.bookmanagement.controller;

import com.bookmanagement.entity.User;
import com.bookmanagement.service.UserService;
import com.bookmanagement.util.JwtUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;

/**
 * 用户控制器，处理用户相关请求
 */
@Controller
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;


    /**
     * 跳转到添加用户页面（管理员功能）
     */
    @GetMapping("/add")/*addUserPage  ：方法名*/
    public String addUserPage( Model model, @RequestParam(defaultValue = "user") String userType) {
        model.addAttribute("userType", userType);
        /*使用Model对象的addAttribute方法向模型添加一个属性，键为"userType"，值为userType参数的值。
        这个属性可以在视图中被访问，用于决定是显示学生添加页面还是教师添加页面*/
        return "admin/user_add";
        /*返回视图名称   "admin/user_add"  */
    }

    @GetMapping("/edit/{id}")
    public String editUserPage(@PathVariable Long id, Model model) {
        User user = userService.findById(id);
        model.addAttribute("user", user);
        model.addAttribute("userType", user.getUserType());
        return "admin/user_edit"; // 对应 book_edit.html
    }

    /**
     * 创建用户（管理员功能）
     * @param user 用户信息
     * @return 响应数据
     */
    @PostMapping("/add")
    @ResponseBody
    public ResponseEntity<Map<String, Object>> addUser(@RequestBody User user) {
//        String username = jwtUtil.getUserIdFromToken(token.replace("Bearer ", "")) + "";
        userService.createUser(user, null);
        /*调用userService的createUser法来创建新用户，传入的参数是user对象和null（可能表示不更新密码或该方法重载中   null   有特殊含义）*/
        Map<String, Object> response = new HashMap<>();
        response.put("code", 0);/*表示操作成功*/
        response.put("message", "创建用户成功");/*"创建用户成功"   提供操作结果的描述。*/
        response.put("data", null);/*表示没有额外的数据需要返回。*/
        return ResponseEntity.ok(response);
        /*使用ResponseEntity来构建 HTTP 响应实体，其中包含状态码200 OK和响应体   response  */
    }/*处理 POST 请求，添加新用户，并返回操作结果。*/

    @PutMapping("/edit")
    @ResponseBody
    public ResponseEntity<Map<String, Object>> updateUser(@RequestBody User user) {
        userService.updateUser(user);
        Map<String, Object> response = new HashMap<>();
        response.put("code", 0);
        response.put("message", "更新用户成功");
        response.put("data", null);
        return ResponseEntity.ok(response);
    }/*处理 PUT 请求，更新现有用户信息，并返回操作结果。*/


    @GetMapping/*这是一个注解，用于映射 HTTP GET 请求到这个方法。*/
    /*方法返回类型是   String  ，表示返回的是一个视图（view）的名称，Spring MVC 会根据这个名称解析为具体的页面。*/
    public String getUsers(@RequestParam(defaultValue = "1") int pageNum,/*请求的页码，默认值为1*/
                           @RequestParam(defaultValue = "10") int pageSize,/*每页的记录数，默认值为10*/
                           @RequestParam(required = false) String username,/*表示用户的用户名，是可选参数*/
                           @RequestParam(required = false) String name,/*用户的真实姓名，可选参数*/
                           @RequestParam(defaultValue = "user") String userType,/*表示用户类型，默认值是user，另一个值是teacher*/
                           Model model) {/*model是 Spring MVC 中的   Model   对象，用于向视图添加属性*/
        Map<String, Object> result = userService.getUsers(pageNum, pageSize, username, name, userType);
        /*调用userService的getUsers方法，传入分页参数和搜索条件，获取用户列表及分页信息。*/
        model.addAttribute("userType", userType);
        model.addAttribute("users", result.get("items"));
        model.addAttribute("total", result.get("total"));
        model.addAttribute("pageNum", pageNum);
        model.addAttribute("pageSize", pageSize);
        model.addAttribute("username", username);
        /*使用Model对象的addAttribute方法向模型添加多个属性：*/
        return "admin/user_list";
    }/*处理 GET 请求，获取用户列表，并返回用户列表页面的视图名称。*/

    @DeleteMapping("/{id}")
    @ResponseBody
    public ResponseEntity<Map<String, Object>> deleteUser(@PathVariable Long id) {
        userService.deleteUser(id);
        /* 调用userService的deleteUser方法，传入用户 ID，以从数据库中删除对应的用户记录。*/
        Map<String, Object> response = new HashMap<>();
        response.put("code", 0);/*表示操作成功。*/
        response.put("message", "删除用户成功");/* "删除用户成功"   提供操作结果的描述。*/
        response.put("data", null);/*表示没有额外的数据需要返回。*/
        return ResponseEntity.ok(response);
        /* 使用ResponseEntity来构建 HTTP 响应实体，其中包含状态码200 OK和响应体response  。*/
    }/*处理 DELETE 请求，根据用户 ID 删除用户，并返回操作结果。*/




    @Autowired
    private JwtUtil jwtUtil;


    /**
     * 跳转到登录页面（默认首页）
     */
    @GetMapping("/login")
    public String loginPage() {
        return "login";
    }

    @GetMapping("/index")
    public String indexPage() {
        return "admin/index";
    }


    /**
     * 用户登录
     * @param username 用户名
     * @param password 密码
     * @return 登录结果及 JWT 令牌
     */
    @PostMapping("/login")
    @ResponseBody
    public ResponseEntity<Map<String, Object>> login(@RequestParam String username, @RequestParam String password) {
        String token = userService.login(username, password);
        User user = userService.findByUsername(username); // 假设 UserService 新增此方法
        Map<String, Object> response = new HashMap<>();
        response.put("code", 0);
        response.put("message", "登录成功");
        response.put("data", token);
        response.put("userType", user.getUserType());
        response.put("userId", user.getId());
        response.put("username", user.getUsername());
        return ResponseEntity.ok(response);
    }

    /**
     * 跳转到注册页面
     */
    @GetMapping("/register")
    public String registerPage() {
        return "register";
    }

    /**
     * 用户注册
     * @param user 用户信息
     * @return 响应数据
     */
    @PostMapping("/register")
    @ResponseBody
    public ResponseEntity<Map<String, Object>> register(@RequestBody User user) {
        userService.registerUser(user);
        Map<String, Object> response = new HashMap<>();
        response.put("code", 0);
        response.put("message", "注册成功");
        response.put("data", null);
        return ResponseEntity.ok(response);
    }

    /**
     * 跳转到修改密码页面，学生没有修改密码的功能
     */
    @GetMapping("/updatePwd")
    public String updatePasswordPage(Model model) {
//        Long userId = jwtUtil.getUserIdFromToken(token.replace("Bearer ", ""));
//        User user = userService.findById(userId);
//        model.addAttribute("userType", user.getUserType());
//        model.addAttribute("userId", userId);
        return "user_update_pwd";
    }

    /**
     * 修改用户密码
     * @param token JWT 令牌
     * @param params 请求参数（原密码、新密码、确认密码）
     * @return 响应数据
     */
    @PatchMapping("/updatePwd")
    @ResponseBody
    public ResponseEntity<Map<String, Object>> updatePassword(@RequestHeader("Authorization") String token,
                                                              @RequestBody Map<String, String> params) {
        Long userId = jwtUtil.getUserIdFromToken(token.replace("Bearer ", ""));
        userService.updatePassword(userId, params.get("old_pwd"), params.get("new_pwd"), params.get("re_pwd"));
        Map<String, Object> response = new HashMap<>();
        response.put("code", 0);
        response.put("message", "密码修改成功");
        response.put("data", null);
        return ResponseEntity.ok(response);
    }


}